package com.literaryfamily.literaryfamily.service.user.security;

import com.literaryfamily.literaryfamily.entity.UserVerificationCode;
import org.springframework.lang.Nullable;

/**
 * 用来确保用户安全的接口
 * 所有涉及读写的方法都需要抛出 WriteError 数据库读写错误异常(这个是运行时异常,只需要抛出不需要处理)
 * 此接口所有方法均不检查用户身份,应该验证身份后在进行检查
 * @author 滑稽/因果报应
 */
public interface VerifyCodeService {
	/**
	 * 发送验证短信到手机(接口会自动生成验证码)
	 *
	 * @param mobile 发送的手机
	 * @param userId 发送的用户,为空时视为注册信息
	 * @param type  验证码类型,如果用户为空时自动填充为注册,即使传入类型也无效
	 * @return 发送结果(包含开始时间, 有效时间, 用户ID, 验证码, 发送到的手机)
	 */
	UserVerificationCode sendVerificationCode(String mobile, @Nullable Long userId, int type);

	/**
	 * 验证验证码,返回的验证结果的可用性必为false,因为进行了可用性更新,更新成功后才返回!
	 *
	 * @param userId     用户ID,为空时视为注册
	 * @param mobile     发送的手机
	 * @param verifyCode 验证码
	 * @param type       验证码类型
	 * @return 验证结果
	 */
	UserVerificationCode validateSmsCode(@Nullable Long userId, String mobile, String verifyCode, int type);

}